/******************************************************************************  
Universidad del Valle de Guatemala
Algoritmos y estructuras de datos
Karen Tojin   08091
Fecha: 15 de Julio de 2009
Descrici�n: Programa que simula un parqueo, con el uso de pilas
***************************************************************************** */

/**
 * @author karenAndy
 *
 */

import java.util.Scanner;

public class Driver {

    /**
     * @param args
     */
    public static void main(String[] args) throws ParqueoVacioException, ParqueoLlenoException, NoEncontradoException {

        char op=' ';
        Scanner ingreso = new Scanner(System.in);

        //***********************************************************************************************
        //-------------------SECCIÓN A MODIFICAR PARA EVALUAR LAS DOS IMPLEMENTACIONES-------------------
        //ParquearStackArreglo<Automovil> miParqueo = new ParquearStackArreglo<Automovil>();
        //ParquearStackArreglo<Automovil> temp = new ParquearStackArreglo<Automovil>();
        ParquearStackLista<Automovil> miParqueo = new ParquearStackLista<Automovil>();
        ParquearStackLista<Automovil> temp = new ParquearStackLista<Automovil>();
        //-------------------SECCIÓN A MODIFICAR PARA EVALUAR LAS DOS IMPLEMENTACIONES-------------------
        //***********************************************************************************************

        do{
            System.out.println("\t\t.::: PARQUEO :::.");
            System.out.println();
            System.out.println("Para ingresar un vehiculo presione \'a\'");
            System.out.println("Para egreso de vehiculos presione \'d\'");
            System.out.println("Para ver el estado del parqueo presione \'v\'");
            System.out.println("Para ver el ultimo automovil que ingreso presione \'u\'");
            System.out.println("Para salir del menu de parqueos presione \'s\'");

            System.out.print("\nIngrese la opcion que desea realizar: ");
            String opcion = ingreso.next();
            if(opcion.length()==1)
                    op = opcion.toUpperCase().charAt(0);
            else
                    System.out.println("\nHa ingresado una opcion invalida\n");

            if (!(op==('A')) && !(op==('D')) && !(op==('V')) && !(op==('U')) && !(op==('S')))//restringe si son n�meros o alguna opci�n inv�lida
            {
                    System.out.println("\nHa ingresado una opcion invalida\n");
            }

            switch(op){
                //En caso de que la opción sea agregar un automóvil
                case 'A':
                {
                    System.out.print("\nIngrese la placa del vehiculo: ");
                    String placa = ingreso.next();
                    try {
                        miParqueo.Push(placa);
                        System.out.println("\nSu automovil ha sido parqueado en el espacio " + miParqueo.Size()+"\n");
                    } catch (Exception exception) {
                        System.out.println(exception);
                    }
                }
                break;
                //En caso de que la opción sea sacar un automóvil
                case 'D':
                {
                    int aColocar;
                    System.out.print("\nIngrese la placa del vehiculo: ");
                    String placa = ingreso.next();
                    try{
                            if (miParqueo.BuscarAuto(placa) == false) {
                                throw new NoEncontradoException("El automovil que busca no fue encontrado, se le aplicara una penalizacion");
                            }
                            else {
                                while (!(miParqueo.Peek().equals(placa))) {
                                    temp.Push(miParqueo.Pop());
                                }
                                miParqueo.Pop();
                                aColocar = temp.Size();
                                int tempColocar = 0;
                                //Ciclo para copiar temporalmente los elementos que se sacaron del stack
                                while (tempColocar<aColocar) {
                                    miParqueo.Push(temp.Pop());
                                    tempColocar++;
                                }
                            }
                            System.out.println("\nSu automovil ha sido retirado\n");
                    } catch (Exception exception) {
                        System.out.println(exception);

                    }

		}
                break;
                //En caso de que la opción sea ver el estado del parqueo
                case 'V':
                {
                    System.out.println("\nEl estado del parqueo es: ");
                    System.out.println(miParqueo.toString());
                }
                break;
                //En caso de que la opción sea ver el último automóvil que ingresó al parqueo
                case 'U':
                {
                    try{
                        System.out.println(miParqueo.Peek());
                    } catch (Exception exception) {
                        System.out.println(exception);
                    }
                }
                break;
           }
        }
        //Hasta que se seleccione la opción de salir del menú de parqueo
        while(!(op==('S')));

        System.out.println("\n\n\t.::Gracias por usar este parqueo::.");
    }
}
